有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的KeyAdapter总是落后一步?

我有下面的代码,它意味着每次按下一个键,焦点在JTextField内时更新JTextArea,并将JTextField的内容附加到JTextArea内的新行上

我的问题是,每次我按下一个键,JTextArea更新总是在我想要的地方后面一个键

例如: 我在JTextField中键入“cat”,JTextArea中只显示“ca”,而不是我想要的完整字符串“cat”

感谢您的建议,感谢您抽出时间阅读

import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class Testing extends JFrame {
    JTextField text;
    JTextArea textArea;

    public static void main(String[] args) {
        Testing gui = new Testing();
        gui.go();
    }

    public void go() {
        this.setLayout(new BorderLayout());
        text = new JTextField();
        text.addKeyListener(new TestKeyListener());
        textArea = new JTextArea();

        this.add(text, BorderLayout.NORTH);
        this.add(textArea, BorderLayout.CENTER);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setSize(300,300);
        this.setVisible(true);
    }

    private class TestKeyListener extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent evt) {
            textArea.append(text.getText() + "\n");
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    这是因为keyPressed甚至在键入的字符保存到JTextField文档之前就发生了。因此,当你试图检索文本时,你“似乎”比实际值落后了一步,但事实并非如此——JTextField目前根本没有新的值

    我知道两种可能的方法来倾听JTextField文档的更改,以实现您想要实现的目标,每种方法都适用于这种特定情况:

    public class TestingTextArea extends JFrame
    {
        JTextField text;
        JTextArea textArea;
    
        public static void main ( final String[] args )
        {
            final TestingTextArea gui = new TestingTextArea ();
            gui.go ();
        }
    
        public void go ()
        {
            this.setLayout ( new BorderLayout () );
            text = new JTextField ();
    
            // Add DocumentListener
            text.getDocument ().addDocumentListener ( new DocumentChangeListener () );
    
            // Or add UndoableEditListener
            text.getDocument ().addUndoableEditListener ( new UndoableEditAdapter () );
    
            textArea = new JTextArea ();                
    
            this.add ( text, BorderLayout.NORTH );
            this.add ( textArea, BorderLayout.CENTER );
    
            this.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
            this.setSize ( 300, 300 );
            this.setVisible ( true );
        }
    
        public class DocumentChangeAdapter implements DocumentListener
        {
            @Override
            public void insertUpdate ( final DocumentEvent e )
            {
                documentChanged ( e );
            }
    
            @Override
            public void removeUpdate ( final DocumentEvent e )
            {
                documentChanged ( e );
            }
    
            @Override
            public void changedUpdate ( final DocumentEvent e )
            {
                documentChanged ( e );
            }
    
            public void documentChanged ( final DocumentEvent e )
            {
                textArea.append ( text.getText () + "\n" );
            }
        }
    
        public class UndoableEditAdapter implements UndoableEditListener
        {
            @Override
            public void undoableEditHappened ( final UndoableEditEvent e )
            {
                textArea.append ( text.getText () + "\n" );
            }
        }
    }